<?php
/**
 * @version		1.0.0 gerenciador_de_arquivos $
 * @package		gerenciador_de_arquivos
 * @copyright	Copyright © 2012 - All rights reserved.
 * @license		GNU/GPL
 * @author		Edio Hanoway Kepke
 * @author mail	hanoway12@gmail.com 
 */

// no direct access
defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.controller');
//require_once(dirname(__FILE__).DS.'helpers'.DS.'assunto.php');
require_once(dirname(__FILE__).DS.'helpers'.DS.'assuntoDAO.php');
require_once(dirname(__FILE__).DS.'helpers'.DS.'arquivoDAO.php');
require_once(dirname(__FILE__).DS.'helpers'.DS.'autorDAO.php');
require_once(dirname(__FILE__).DS.'helpers'.DS.'arquivoassuntoDAO.php');
require_once(dirname(__FILE__).DS.'helpers'.DS.'arquivoautorDAO.php');
require_once(dirname(__FILE__).DS.'helpers'.DS.'tools'.DS.'error.php');
require_once(dirname(__FILE__).DS.'helpers'.DS.'tools'.DS.'fum.php');

class gerenciador_de_arquivosController extends JController
{    
    function __construct()
    {
            parent::__construct();
    }
            
    public function display($cachable = false, $urlparams = false)
    {            
        switch (JRequest::getVar("task")) 
        {
            case "getassunto" : $this->getAssuntos(); break;
            case "getautor" : $this->getAutores(); break;
            case "insert": $this->insertArquivo(); break;
            case "pesquisar": $this->pesquisar(); break;
            default: parent::display();break;
        }
    }
    
    
    private function pesquisar()
    {                
        $options = JRequest::getVar("options");
        
        if(!is_null($options) && $options)
        {       
            $options = (object)$options;
            
            $arquivoDao = ArquivoDAO::instance();                        
            $arquivoDao->setDb(JFactory::getDBO());
            
            $arquivos = $arquivoDao->select($options);            
                                    
            if($arquivos)
            {                                
                echo json_encode(Fum::getArrayReturn(Error::NOT_EXIST_ERROR, $arquivos));
            }
            else
            {
                echo json_encode(Fum::getArrayReturn(Error::NOT_FOUND_REGISTRY));
            }
        }
        else
        {
            echo json_encode(Fum::getArrayReturn(Error::INSUFFICIENT_PARAMETERS));
        }
        
        jexit();        
        return;
        
    }

    private function getAssuntos()
    {            
        $condition = JRequest::getVar("text");
                
        if(!is_null($condition) && $condition)
        {                
            $assuntoDao = AssuntoDAO::instance();
            $assuntoDao->setDb(JFactory::getDBO());
            $assuntos = $assuntoDao->selectLike($condition."%");                        
            
            if($assuntos)
            {
                echo json_encode($assuntos);                
            }
            else
            {
                echo json_encode(array());
            }
        }
        else
        {
            echo json_encode(array());
        }
        jexit();            
    }
    
    private function getAutores()
    {            
        $condition = JRequest::getVar("text");

        if(!is_null($condition) && $condition)
        {                
            $autorDao = AutorDAO::instance();
            $autorDao->setDb(JFactory::getDBO());
            $autores = $autorDao->selectLike($condition."%");
            if($autores)
            {
                echo json_encode($autores);                
            }
            else
            {
                echo json_encode(array());
            }
        }
        else 
        {
            echo json_encode(array());
        }        
        jexit();            
    }

    private function insertArquivo()
    {                                                             
        $idDono = $this->getIdUser();

        if($idDono && !is_null($idDono))
        {
            $arquivo = json_decode(urldecode(JRequest::getVar("arquivo", false, "POST")),true);
            $file = JRequest::getVar("arquivo", false, "FILES");
                                    
            
            $arquivo["id_dono"] = $idDono;
            
            if(!is_null($arquivo) && $arquivo && $file && !is_null($file))
            {                                
                
                $idAutores= $this->getIdsAutores($arquivo);
                $idAssuntos = $this->getIdsAssunto($arquivo);
                
                if(empty($idAutores) || empty($idAssuntos) )
                {
                    echo json_encode(Fum::getArrayReturn(Error::INTERNAL_SERVER_ERROR));                    
                }
                
                $arquivo["file"] = $this->uploadFile($file,$arquivo);
                
                if(is_numeric($arquivo["file"]))
                {                          
                    echo json_encode(Fum::getArrayReturn($url_arquivo));
                    jexit();
                    return;
                }
                else
                {                                        
                    $arquivoDao = ArquivoDAO::instance();                
                    $arquivoDao->setDb(JFactory::getDBO());
                
                    $idArquivo = $arquivoDao->insert($arquivo,true);
                                                                                
                    if(is_numeric($idArquivo) && $idArquivo)
                    {
                        $this->bindArquivoAssunto($idArquivo, $idAssuntos);
                        $this->bindArquivoAutor($idArquivo, $idAutores);
                        echo json_encode(Fum::getArrayReturn(Error::NOT_EXIST_ERROR));
                    }                                                            
                    else
                    {
                        echo json_encode(Fum::getArrayReturn(Error::INTERNAL_SERVER_ERROR));
                    }
                }
                
                                       
            }
            else
            {
                echo json_encode(Fum::getArrayReturn(Error::INSUFFICIENT_PARAMETERS));
            }
        }
        else
        {
            echo json_encode(Fum::getArrayReturn(Error::NOT_EXIST_LOGIN_USER));
        }
        jexit();
    }
    
    private function getIdsAssunto($arquivo)
    {        
        $idsAssuntos = array();
        
        $assuntoDao = AssuntoDAO::instance();
        
        $assuntoDao->setDb(JFactory::getDBO());
        
        foreach ($arquivo["assunto"] as $assunto) 
        {                        
            $assuntoObj = $assuntoDao->selectObject($assunto);
            if(!is_null($assuntoObj))
            {
                $idsAssuntos[] = $assuntoObj->id;
            }
            else
            {
                $id = $assuntoDao->insert($assunto, true);
                if(is_numeric($id) && $id)
                {
                    $idsAssuntos[] = $id;
                }                
            }
        }
        
        return $idsAssuntos;
    }
    
    private function getIdsAutores($arquivo)
    {
        $idsAutores = array();
        
        $autorDao = AutorDAO::instance();
        
        $autorDao->setDb(JFactory::getDBO());
        
        foreach ($arquivo["autor"] as $autor) 
        {                        
            $autorObj = $autorDao->selectObject($autor);
            if(!is_null($autorObj))
            {
                $idsAutores[] = $autorObj->id;
            }
            else
            {
                $id = $autorDao->insert($autor, true);
                if(is_numeric($id) && $id)
                {
                    $idsAutores[] = $id;
                }                
            }
        }
        
        return $idsAutores;                                       
    }    
   
    private function bindArquivoAssunto($idArquivo, $idAssuntos)
    {                
        $arquivoAssuntoDao = ArquivoAssuntoDAO::instance();
        
        $arquivoAssuntoDao->setDb(JFactory::getDBO());
        
        foreach ($idAssuntos as $idAssunto)
        {                        
            $arquivoassuntoObj = $arquivoAssuntoDao->selectObject($idArquivo, $idAssunto);
            if(is_null($arquivoassuntoObj))
            {
                $arquivoAssuntoDao->insert($idArquivo, $idAssunto);                
            }            
        }                                
    }
    
    private function bindArquivoAutor($idArquivo, $idsAutor)
    {
        $arquivoAutorDao = ArquivoAutorDAO::instance();
        
        $arquivoAutorDao->setDb(JFactory::getDBO());
                
        foreach ($idsAutor as $idAutor)
        {                        
            $arquivoAutorObj = $arquivoAutorDao->selectObject($idArquivo, $idAutor);
                        
            if(is_null($arquivoAutorObj))
            {    
                $arquivoAutorDao->insert($idArquivo, $idAutor);                
            }            
        }          
    }

    private function getIdUser()
    {
        $user = JFactory::getUser();
        return $user->id;            
    }        

    private function uploadFile($file, $info)
    {                           
        
//        echo Fum::printToDebug($file);
        
        $file = (object) $file;
        $urlbase = getcwd();
        $uploaddir = '/files_gerenciador_de_arquivos';
        
        
        //cria diretorios se estes não existirem
        if(!file_exists($uploaddir))
        {
            $this->createFolder($urlbase.$uploaddir);
            $this->createFolder($urlbase.$uploaddir."/tcc");
            $this->createFolder($urlbase.$uploaddir."/tese");
            $this->createFolder($urlbase.$uploaddir."/artigo");
            $this->createFolder($urlbase.$uploaddir."/sic");
            $this->createFolder($urlbase.$uploaddir."/dissertacoes");
        }

        //setar variaveis de ambiente
        ini_set("upload_max_filesize",  Arquivo::MAX_FILE_UPLOAD."M");
        ini_set("memory_limit",  Arquivo::MAX_FILE_UPLOAD."M");
        ini_set("post_max_size",  Arquivo::MAX_FILE_UPLOAD."M");
        
        //verifica se não teve erro no upload                                   
        if ($file->error != 0) 
        {                                                                    
            switch ($file->error) 
            {
                case 1: return Error::FILE_SIZE_EXCEPTION_PHP;
                case 2: return Error::FILE_SIZE_EXCEPTION_HTML;
                case 3: return Error::FILE_PARCIAL_UPLOAD;
                case 4: return Error::FILE_NOT_UPLOAD;                
                default : return Error::INTERNAL_SERVER_ERROR;
            }                        
        }

//        $arquivosNaoPermitidos = array("pdf");
//        
//        
        // Faz a verificação da extensão do arquivo
        //$extensao = strtolower(end(explode('.', $file->name)));
//                
//        if (!in_array($extensao, $arquivosNaoPermitidos)) 
//        {            
//            return Error::FILE_IS_NOT_ALLOWED;
//        }

                                                              
        if (Arquivo::MAX_FILE_UPLOAD < ($file->size/(1024*1024))) 
        {
            return Error::FILE_IS_VERY_BIG;
        }
        
        
        
        //setar o nome do arquivo
        $nomeFinal = time().Fum::cleanWord($file->name, array("removeAccentuation" => true, "lowercase" => true, "removeSpace" => "_"));
        
        
        //setar local do arquivo
        switch ($info["tipo"]) 
        {
            case "tcc": $dirfile = $uploaddir."/tcc/"; break;
            case "tese": $dirfile = $uploaddir."/tese/";break;
            case "artigo": $dirfile = $uploaddir."/artigo/";break;
            case "sic": $dirfile = $uploaddir."/sic/";break;
            case "dissertacoes": $dirfile = $uploaddir."/dissertacoes/";break;
            default : $dirfile = $uploaddir."/";
        }
                
        
        if (move_uploaded_file($file->tmp_name, $urlbase.$dirfile.$nomeFinal))
        {
            return $dirfile.$nomeFinal;
        } 
               
        return Error::INTERNAL_SERVER_ERROR;                                                      
    }
    
    
    public function createFolder($url)
    {
        @mkdir($url, 0777);
        file_put_contents($url."/index.php", '<html><body bgcolor="#FFFFFF"></body></html>');        
    }
    
}
?>